package com.longchat.utils;
import sun.misc.BASE64Decoder;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*;
/**
 * @author auto
 */
public class Utils{
    /**
     * 判断一个字符串是否为空
     *
     * @param str
     *
     * @return
     */
    public static boolean isEmptyStr(String str){
        if(str==null){
            return true;
        }
        str=str.trim();
        return str.isEmpty();
    }
    
    /**
     * 判断对象是否为空
     *
     * @param obj
     *
     * @return
     */
    public static boolean isNotNull(Object obj){
        if(obj!=null){
            return true;
        }
        return false;
    }
    
    public static boolean isEmptyStr(Object s){
        return (s==null)||(s.toString().trim().length()==0);
    }   
    /**
     * 判断传入参数是否为空,空字符串""或"null"或"<null> 为了兼容ios的空获取到<null>字符串
     *
     * @param s 待判断参数
     *
     * @return true 空 <br>
     * false 非空
     */
    public static boolean isEmptyString(Object s){
        return (s==null)||(s.toString().trim().length()==0)||s.toString().trim().equalsIgnoreCase("null")||s.toString().trim().equalsIgnoreCase("<null>");
    }
    /**
     * 对传入参数进行判断是否为空,为空则返回"",反之返回传入参数
     *
     * @param v 传入参数
     *
     * @return 处理后的参数
     */
    public static String filterNullValue(String v){
        return isEmptyString(v)?"":v;
    }
    
    /**
     * 设定安全的密码，生成随机的salt并经过1024次 sha-1 hash
     * 当用户提供明文密码是
     *
     * @param password 用户输入密码
     */
//    public static Map<String,String> entryptPassword(String password){
//        Map<String,String> map=new HashMap<>();
//        password=Utils.isEmptyString(password)?Setting.PASSWORD:password;
//        byte[] salt=Digests.generateSalt(Setting.SALT_SIZE);
//        byte[] hashPassword=Digests.sha1(password.getBytes(),salt,Setting.HASH_INTERATIONS);
//        password=Encodes.encodeHex(hashPassword);
//        map.put("password",password);
//        map.put("enCodeSalt",Encodes.encodeHex(salt));
//        return map;
//    }


    /**
     * 将base64编码的字符串转换成图片保存到相应的路径
     *
     * @param imageInf 图片 字符串
     * @param path     保存的路径
     *
     * @return 是否保存成功状态
     *
     * @throws IOException IO读写错误
     */
    public static boolean saveFileToDisk(String imageInf,String path){//对字节数组字符串进行Base64解码并生成图片
        try{
            if(imageInf==null){
                //图像数据为空
                return false;
            }
            BASE64Decoder decoder=new BASE64Decoder();
            //Base64解码
            byte[] b=decoder.decodeBuffer(imageInf);
            for(int i=0;i<b.length;++i){
                if(b[i]<0){//调整异常数据
                    b[i]+=256;
                }
            }
            //生成jpeg图片
            OutputStream out=new FileOutputStream(path);
            out.write(b);
            out.flush();
            out.close();
            return true;
        }catch(IOException e){
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 获取随机数
     * @param length 随机数的长度
     * @return
     */
    public static String getRandomString(int length) {
        String base = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
    
    /**
     * 生成订单号（充值专用）
     * 规则:"F1607261629280546579"
     * 160726162928：年月日时分秒   054：随机三位数   6579：手机末尾四位
     * @param nonce 当前时间的毫秒数
     * @param mobile 手机号码
     * @return
     */
    public static String getOrderNoForRecharge(String nonce, String mobile) {
        String randomStr = Utils.getRandomString(3);
        mobile = mobile.substring(mobile.length()-4, mobile.length());
        return "F" + nonce + randomStr + mobile;
    }
    
    /**
     * 生成订单号
     * 规则:"F201704171712293380546579"
     * 20170417171229338：年月日时分秒毫秒   0546579：随机7位数
     * @param prefix 前缀
     * @return
     */
    public static String getOrderNo(String prefix) {
        String time = DateUtil.getInstance().formatDate(new Date(), DateUtil.yyyyMMddHHmmssSSS);
        String randomStr = Utils.getRandomString(7);
        return prefix + time + randomStr;
    }
    
    /**
     * 截取BigDecimal的小数点后的位数
     * @param dValue 源数据
     * @param format 截取的目标格式  "#,###.0000" "0.00"
     * @return
     */
    public static BigDecimal formatBigDecimal(BigDecimal dValue, String format) {
        try {
            dValue.setScale(2, BigDecimal.ROUND_DOWN);
            BigDecimal newBigDecimal = dValue;
            
            DecimalFormat decimalFormat = new DecimalFormat(format);
            decimalFormat.setRoundingMode(RoundingMode.DOWN);
            String result = decimalFormat.format(newBigDecimal);
            return new BigDecimal(result);
        } catch (Exception e) {
            return dValue;
        }
    }
    
    /**
     * 格式化数值 保留两位小数
     * @param d  数值
     *
     * @return
     */
    public static String foratNumber(Double d){
        DecimalFormat numFormat = new DecimalFormat("###0.00");
        return numFormat.format(d);
    }
    
    /**
     * 首字母大写
     * 
     * @param srcStr
     * @return
     */
    public static String firstCharacterToUpper(String srcStr) {
        return srcStr.substring(0, 1).toUpperCase() + srcStr.substring(1);
    }

    /**
     * 替换字符串并让它的下一个字母为大写
     * 
     * @param srcStr
     * @param org
     * @param ob
     * @return
     */
    public static String replaceUnderlineAndfirstToUpper(String srcStr,
            String org, String ob) {
        String newString = "";
        int first = 0;
        while (srcStr.indexOf(org) != -1) {
            first = srcStr.indexOf(org);
            if (first != srcStr.length()) {
                newString = newString + srcStr.substring(0, first) + ob;
                srcStr = srcStr
                        .substring(first + org.length(), srcStr.length());
                srcStr = firstCharacterToUpper(srcStr);
            }
        }
        newString = newString + srcStr;
        return newString;
    }
    
    /**
     * 获取去掉横线的长度为32的UUID串.
     * 
     * @return uuid.
     */
    public static String get32UUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }
    
    /**
     * 函数功能说明 ： 判断对象是否为空
     * 
     * @参数： @param obj
     * @参数： @return
     * @return boolean
     * @throws
     */
    public static boolean isEmpty(Object obj) {
        if (null == obj) {
            return true;
        }
        if (obj instanceof String) {
            return ((String) obj).trim().isEmpty();
        }
        return !(obj instanceof Number) ? false : false;
    }
}
